home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1998 / MacHack 1998.toast / Papers / C++ Exceptions / µShell / Core Utilities / ClassDesc.cp < prev    next >
Encoding:
Text File  |  1998-06-06  |  2.7 KB  |  136 lines  |  [TEXT/CWIE]

  1. #include "ClassDesc.h"
  2. #include "TheDebugger.h"
  3.  
  4. #include <stddef.h>
  5.  
  6. //------------------------------------------------------------------------------
  7.  
  8. ClassDesc*    ClassDesc::fgClassList        = nil;    // List of ClassDesc, indexed by class ID.
  9. ClassID        ClassDesc::fgLastClassID    = 0;    // The last used unique class ID.
  10.  
  11. //------------------------------------------------------------------------------
  12. #pragma segment Main
  13.  
  14. ClassDesc::ObjectRef::ObjectRef()
  15. :    fClassID(kUninitializedClassID),
  16.     fClassOffset(0)
  17. {
  18. #if qTheDebugger
  19.     TheDbgr_Add_Object(this);
  20. #endif
  21. }
  22.  
  23. //------------------------------------------------------------------------------
  24. #pragma segment Main
  25.  
  26. ClassDesc::ObjectRef::~ObjectRef()
  27. {
  28. #if qTheDebugger
  29.     TheDbgr_Delete_Object(this);
  30. #endif
  31. }
  32.  
  33. //------------------------------------------------------------------------------
  34. #pragma segment Init
  35.  
  36. ClassDesc::ClassDesc(size_t size, size_t offset, char* name, const ClassDesc** base_List, const DescType* ae_classes) :
  37.     fDefaultConstructor(nil),
  38.     fNextClassDesc(fgClassList),
  39.     fClassName(name),
  40.     fClassSize(size),
  41.     fClassID(++fgLastClassID),
  42.     fBaseClass(nil),
  43.     fBaseClassDescList(nil),
  44.     fClassOffset(-offset),
  45.     fAEClassIDs(ae_classes)
  46. {
  47.     fDefaultConstructor = this;
  48.  
  49.     if (qDebug && fgClassList == nil)
  50.     {
  51.         if (offsetof(ClassDesc, fClassName) != 8
  52.         ||    offsetof(ClassDesc, fClassID)    != 16)
  53.         {
  54.             DebugStr("\pClassDesc is mis-aligned");
  55.         }
  56.     }
  57.  
  58.     fgClassList = this;
  59.     
  60.     if (base_List != nil)
  61.     {
  62.         if ((fBaseClass = base_List[0]) != nil)
  63.         {
  64.             fBaseClassDescList = &base_List[1];
  65.         }
  66.     }
  67. }
  68.  
  69. //------------------------------------------------------------------------------
  70. #pragma segment Main
  71.  
  72. void ClassDesc::RegisterObject(ObjectRef& ref, void* object) const
  73. {
  74.     long offset = object ? ((char*) object) - ((char*) &ref) : 0;
  75.  
  76.     ref.fClassID        = fClassID;
  77.     ref.fClassOffset    = offset;
  78.     
  79.     const_cast<ClassDesc*>(this)->fClassOffset = offset;
  80. }
  81.  
  82. //------------------------------------------------------------------------------
  83.  
  84. /*
  85. AEClassListHdl ClassDesc::GetAEClasses() const
  86. {
  87.     Debugger();
  88.     
  89.     return nil;
  90. }
  91. */
  92.  
  93. //------------------------------------------------------------------------------
  94.  
  95. /*
  96. bool ClassDesc::IsAEClass(DescType aClassID) const
  97. {
  98.     const DescType* idlist = fAEClassIDs;
  99.  
  100.     if (idlist != nil) // we have classes
  101.     {
  102.         DescType  id;
  103.     
  104.         while ((id = *idlist++) != 0)
  105.         {
  106.             if (id == aClassID)
  107.             {
  108.                 return true;
  109.             }
  110.         }
  111.     }
  112.     
  113.     // we don't handle it directly -- try superclasses
  114.     
  115.     const ClassDesc* base = fBaseClass;
  116.     
  117.     if (base != nil)
  118.     {
  119.         const ClassDesc** baseList = fBaseClassDescList;
  120.  
  121.         do
  122.         {
  123.             if (base->IsAEClass(aClassID))
  124.             {
  125.                 return true;
  126.             }
  127.         }
  128.         while ((base = *baseList++) != nil);
  129.     }
  130.     
  131.     return false;
  132. }
  133. */
  134.  
  135. //------------------------------------------------------------------------------
  136.